Error Handlingの実装
Error Handlingをコンパイラレベルで実装する時の話
コンパイル時に実行できる箇所と、実行時にしか実行できない箇所をちゃんと区別しないとごっちゃになりそう
例外処理の手順
例外がthrowされたら、そのスコープがtryの中かどうかを確認する
tryの中でなかったら、今いるmethodの呼び出し元へ戻る
という作業を繰り返して、もっとも近いスコープにあるtry節を見つけ、そのままcatch節へジャンプする
この時に排他制御の処理をするメソッドを抜ける必要がある場合は、排他ロックの解除も同時にしないといけない
フェーズ
コンパイル時に実行できる箇所
throwがtryブロックの中にあるかどうかのチェック
もしtryの中ならcatchへジャンプ
そうじゃないなら呼び出し元へ戻る
というコード生成をする
実行時に実行できる箇所
thorwされたmethodを抜けて呼び出し元へ戻る
実現方法
『コンパイラとバーチャルマシン』.icon p.123も参考
例外の発生を検出して投げる方法
投げた例外をハンドラまで送り届けるもの(try..catch)
2返戻値法
表引き法
#??
『コンパイラとバーチャルマシン』.iconにかかれているのはtry..catchのようなよくある手続き的な例外機構の話だが、
型を用いたError Handlingのようなものでは、全然異なる実装になると思う
やっぱりモダンな後者のほうが楽なんだろうか
参考
『コンパイラとバーチャルマシン』 8章